home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / include / awk / awk.h next >
C/C++ Source or Header  |  2005-10-13  |  37KB  |  1,171 lines

  1. /*
  2.  * awk.h -- Definitions for gawk. 
  3.  */
  4.  
  5. /* 
  6.  * Copyright (C) 1986, 1988, 1989, 1991-2004 the Free Software Foundation, Inc.
  7.  * 
  8.  * This file is part of GAWK, the GNU implementation of the
  9.  * AWK Programming Language.
  10.  * 
  11.  * GAWK is free software; you can redistribute it and/or modify
  12.  * it under the terms of the GNU General Public License as published by
  13.  * the Free Software Foundation; either version 2 of the License, or
  14.  * (at your option) any later version.
  15.  * 
  16.  * GAWK is distributed in the hope that it will be useful,
  17.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  * GNU General Public License for more details.
  20.  * 
  21.  * You should have received a copy of the GNU General Public License
  22.  * along with this program; if not, write to the Free Software
  23.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
  24.  */
  25.  
  26. /* ------------------------------ Includes ------------------------------ */
  27.  
  28. /*
  29.  * config.h absolutely, positively, *M*U*S*T* be included before
  30.  * any system headers.  Otherwise, extreme death, destruction
  31.  * and loss of life results.
  32.  *
  33.  * Well, OK, gawk just won't work on systems using egcs and LFS.  But
  34.  * that's almost as bad.
  35.  */
  36. #ifdef HAVE_CONFIG_H
  37. #include <config.h>
  38. #endif
  39.  
  40. #ifndef _GNU_SOURCE
  41. #define _GNU_SOURCE    1    /* enable GNU extensions */
  42. #endif /* _GNU_SOURCE */
  43.  
  44. #include <stdio.h>
  45. #include <assert.h>
  46. #ifdef HAVE_LIMITS_H
  47. #include <limits.h>
  48. #endif /* HAVE_LIMITS_H */
  49. #include <ctype.h>
  50. #include <setjmp.h>
  51.  
  52. #include "gettext.h"
  53. #define _(msgid)  gettext(msgid)
  54. #define N_(msgid) msgid
  55.  
  56. #if ! (defined(HAVE_LIBINTL_H) && defined(ENABLE_NLS) && ENABLE_NLS > 0)
  57. #ifndef LOCALEDIR
  58. #define LOCALEDIR NULL
  59. #endif /* LOCALEDIR */
  60. #endif
  61.  
  62. #if defined(HAVE_STDARG_H) && defined(__STDC__) && __STDC__
  63. #include <stdarg.h>
  64. #else
  65. #include <varargs.h>
  66. #endif
  67. #include <signal.h>
  68. #include <time.h>
  69. #include <errno.h>
  70. #if ! defined(errno) && ! defined(MSDOS) && ! defined(OS2)
  71. extern int errno;
  72. #endif
  73. #ifdef HAVE_SIGNUM_H
  74. #include <signum.h>
  75. #endif
  76.  
  77. #include "mbsupport.h" /* defines MBS_SUPPORT */
  78.  
  79. #if defined(MBS_SUPPORT)
  80. /* We can handle multibyte strings.  */
  81. #include <wchar.h>
  82. #include <wctype.h>
  83. #endif
  84.  
  85. /* ----------------- System dependencies (with more includes) -----------*/
  86.  
  87. /* This section is the messiest one in the file, not a lot that can be done */
  88.  
  89. /* First, get the ctype stuff right; from Jim Meyering */
  90. #if defined(STDC_HEADERS) || (!defined(isascii) && !defined(HAVE_ISASCII))
  91. #define IN_CTYPE_DOMAIN(c) 1
  92. #else
  93. #define IN_CTYPE_DOMAIN(c) isascii((unsigned char) c)
  94. #endif
  95.  
  96. #ifdef isblank
  97. #define ISBLANK(c) (IN_CTYPE_DOMAIN(c) && isblank((unsigned char) c))
  98. #else
  99. #define ISBLANK(c) ((c) == ' ' || (c) == '\t')
  100. #endif
  101. #ifdef isgraph
  102. #define ISGRAPH(c) (IN_CTYPE_DOMAIN(c) && isgraph((unsigned char) c))
  103. #else
  104. #define ISGRAPH(c) (IN_CTYPE_DOMAIN(c) && isprint((unsigned char) c) && !isspace((unsigned char) c))
  105. #endif
  106.  
  107. #define ISPRINT(c) (IN_CTYPE_DOMAIN (c) && isprint ((unsigned char) c))
  108. #define ISDIGIT(c) (IN_CTYPE_DOMAIN (c) && isdigit ((unsigned char) c))
  109. #define ISALNUM(c) (IN_CTYPE_DOMAIN (c) && isalnum ((unsigned char) c))
  110. #define ISALPHA(c) (IN_CTYPE_DOMAIN (c) && isalpha ((unsigned char) c))
  111. #define ISCNTRL(c) (IN_CTYPE_DOMAIN (c) && iscntrl ((unsigned char) c))
  112. #define ISLOWER(c) (IN_CTYPE_DOMAIN (c) && islower ((unsigned char) c))
  113. #define ISPUNCT(c) (IN_CTYPE_DOMAIN (c) && ispunct (unsigned char) (c))
  114. #define ISSPACE(c) (IN_CTYPE_DOMAIN (c) && isspace ((unsigned char) c))
  115. #define ISUPPER(c) (IN_CTYPE_DOMAIN (c) && isupper ((unsigned char) c))
  116. #define ISXDIGIT(c) (IN_CTYPE_DOMAIN (c) && isxdigit ((unsigned char) c))
  117.  
  118. #ifndef TOUPPER
  119. #define TOUPPER(c)    toupper((unsigned char) c)
  120. #endif
  121. #ifndef TOLOWER
  122. #define TOLOWER(c)    tolower((unsigned char) c)
  123. #endif
  124.  
  125. #ifdef __STDC__
  126. #define    P(s)    s
  127. #define MALLOC_ARG_T size_t
  128. #else    /* not __STDC__ */
  129. #define    P(s)    ()
  130. #define MALLOC_ARG_T unsigned
  131. #define volatile
  132. #endif    /* not __STDC__ */
  133.  
  134. #ifndef VMS
  135. #include <sys/types.h>
  136. #include <sys/stat.h>
  137. #else    /* VMS */
  138. #include <stddef.h>
  139. #include <stat.h>
  140. #include <file.h>    /* avoid <fcntl.h> in io.c */
  141. #endif    /* VMS */
  142.  
  143. #if ! defined(S_ISREG) && defined(S_IFREG)
  144. #define    S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
  145. #endif
  146.  
  147. #ifdef STDC_HEADERS
  148. #include <stdlib.h>
  149. #else    /* not STDC_HEADERS */
  150. #include "protos.h"
  151. #endif    /* not STDC_HEADERS */
  152.  
  153. #ifdef HAVE_STRING_H
  154. #include <string.h>
  155. #ifdef NEED_MEMORY_H
  156. #include <memory.h>
  157. #endif    /* NEED_MEMORY_H */
  158. #else    /* not HAVE_STRING_H */
  159. #ifdef HAVE_STRINGS_H
  160. #include <strings.h>
  161. #endif    /* HAVE_STRINGS_H */
  162. #endif    /* not HAVE_STRING_H */
  163.  
  164. #ifdef NeXT
  165. #if __GNUC__ < 2 || __GNUC_MINOR__ < 7
  166. #include <libc.h>
  167. #endif
  168. #undef atof
  169. #define getopt GNU_getopt
  170. #define GFMT_WORKAROUND
  171. #endif    /* NeXT */
  172.  
  173. #if defined(atarist) || defined(VMS)
  174. #include <unixlib.h>
  175. #endif    /* atarist || VMS */
  176.  
  177. #if ! defined(MSDOS) && ! defined(OS2) && ! defined(WIN32) && ! defined(__EMX__) && ! defined(__CYGWIN__) && ! defined(O_BINARY) /*duh*/
  178. #define O_BINARY    0
  179. #endif
  180.  
  181. #if defined(TANDEM)
  182. #define variable variabl
  183. #define open(name, how, mode)    open(name, how)    /* !!! ANSI C !!! */
  184. #endif
  185.  
  186. #if HAVE_UNISTD_H
  187. #include <unistd.h>
  188. #endif    /* HAVE_UNISTD_H */
  189.  
  190. #ifndef HAVE_VPRINTF
  191. /* if you don't have vprintf, try this and cross your fingers. */
  192. #ifdef    HAVE_DOPRNT
  193. #define vfprintf(fp,fmt,arg)    _doprnt((fmt), (arg), (fp))
  194. #else    /* not HAVE_DOPRNT */
  195. you
  196. lose
  197. #endif    /* not HAVE_DOPRNT */
  198. #endif    /* HAVE_VPRINTF */
  199.  
  200. #ifndef HAVE_SETLOCALE
  201. #define setlocale(locale, val)    /* nothing */
  202. #endif /* HAVE_SETLOCALE */
  203.  
  204. /* use this as lintwarn("...")
  205.    this is a hack but it gives us the right semantics */
  206. #define lintwarn (*(set_loc(__FILE__, __LINE__),lintfunc))
  207.  
  208. #ifdef VMS
  209. #include "vms/redirect.h"
  210. #endif  /*VMS*/
  211.  
  212. #ifdef atarist
  213. #include "unsupported/atari/redirect.h"
  214. #endif
  215.  
  216. #define    GNU_REGEX
  217. #ifdef GNU_REGEX
  218. #include "regex.h"
  219. #include "dfa.h"
  220. typedef struct Regexp {
  221.     struct re_pattern_buffer pat;
  222.     struct re_registers regs;
  223.     struct dfa dfareg;
  224.     short dfa;
  225.     short has_anchor;    /* speed up of avoid_dfa kludge, temporary */
  226. } Regexp;
  227. #define    RESTART(rp,s)    (rp)->regs.start[0]
  228. #define    REEND(rp,s)    (rp)->regs.end[0]
  229. #define    SUBPATSTART(rp,s,n)    (rp)->regs.start[n]
  230. #define    SUBPATEND(rp,s,n)    (rp)->regs.end[n]
  231. #define    NUMSUBPATS(rp,s)    (rp)->regs.num_regs
  232. #endif    /* GNU_REGEX */
  233.  
  234. /* Stuff for losing systems. */
  235. #ifdef STRTOD_NOT_C89
  236. extern double gawk_strtod();
  237. #define strtod gawk_strtod
  238. #endif
  239.  
  240. #if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
  241. # define __attribute__(x)
  242. #endif
  243.  
  244. #ifndef ATTRIBUTE_UNUSED
  245. #define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
  246. #endif /* ATTRIBUTE_UNUSED */
  247.  
  248. #ifndef ATTRIBUTE_NORETURN
  249. #define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
  250. #endif /* ATTRIBUTE_NORETURN */
  251.  
  252. #ifndef ATTRIBUTE_PRINTF
  253. #define ATTRIBUTE_PRINTF(m, n) __attribute__ ((__format__ (__printf__, m, n)))
  254. #define ATTRIBUTE_PRINTF_1 ATTRIBUTE_PRINTF(1, 2)
  255. #endif /* ATTRIBUTE_PRINTF */
  256.  
  257. /* We use __extension__ in some places to suppress -pedantic warnings
  258.    about GCC extensions.  This feature didn't work properly before
  259.    gcc 2.8.  */
  260. #if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8)
  261. #define __extension__
  262. #endif
  263.  
  264. /* this is defined by Windows32 extension libraries. It must be added to
  265.  * every variable which is exported (including function pointers) */
  266. #if defined(WIN32_EXTENSION) && !defined(ATTRIBUTE_EXPORTED)
  267. # define ATTRIBUTE_EXPORTED __declspec(dllimport)
  268. #else
  269. # define ATTRIBUTE_EXPORTED
  270. #endif
  271.  
  272.  
  273. /* ------------------ Constants, Structures, Typedefs  ------------------ */
  274.  
  275. #ifndef AWKNUM
  276. #define AWKNUM    double
  277. #endif
  278.  
  279. #ifndef TRUE
  280. /* a bit hackneyed, but what the heck */
  281. #define TRUE    1
  282. #define FALSE    0
  283. #endif
  284.  
  285. #define LINT_INVALID    1    /* only warn about invalid */
  286. #define LINT_ALL    2    /* warn about all things */
  287.  
  288. /* Figure out what '\a' really is. */
  289. #ifdef __STDC__
  290. #define BELL    '\a'        /* sure makes life easy, don't it? */
  291. #else
  292. #    if 'z' - 'a' == 25    /* ascii */
  293. #        if 'a' != 97    /* machine is dumb enough to use mark parity */
  294. #            define BELL    '\207'
  295. #        else
  296. #            define BELL    '\07'
  297. #        endif
  298. #    else
  299. #        define BELL    '\057'
  300. #    endif
  301. #endif
  302.  
  303. typedef enum nodevals {
  304.     /* illegal entry == 0 */
  305.     Node_illegal,
  306.  
  307.     /* binary operators  lnode and rnode are the expressions to work on */
  308.     Node_times,
  309.     Node_quotient,
  310.     Node_mod,
  311.     Node_plus,
  312.     Node_minus,
  313.     Node_cond_pair,        /* conditional pair (see Node_line_range) */
  314.     Node_subscript,
  315.     Node_concat,
  316.     Node_exp,
  317.  
  318.     /* unary operators   subnode is the expression to work on */
  319.     Node_preincrement,
  320.     Node_predecrement,
  321.     Node_postincrement,
  322.     Node_postdecrement,
  323.     Node_unary_minus,
  324.     Node_field_spec,
  325.  
  326.     /* assignments   lnode is the var to assign to, rnode is the exp */
  327.     Node_assign,
  328.     Node_assign_times,
  329.     Node_assign_quotient,
  330.     Node_assign_mod,
  331.     Node_assign_plus,
  332.     Node_assign_minus,
  333.     Node_assign_exp,
  334.     Node_assign_concat,
  335.  
  336.     /* boolean binaries   lnode and rnode are expressions */
  337.     Node_and,
  338.     Node_or,
  339.  
  340.     /* binary relationals   compares lnode and rnode */
  341.     Node_equal,
  342.     Node_notequal,
  343.     Node_less,
  344.     Node_greater,
  345.     Node_leq,
  346.     Node_geq,
  347.     Node_match,
  348.     Node_nomatch,
  349.  
  350.     /* unary relationals   works on subnode */
  351.     Node_not,
  352.  
  353.     /* program structures */
  354.     Node_rule_list,        /* lnode is a rule, rnode is rest of list */
  355.     Node_rule_node,        /* lnode is pattern, rnode is statement */
  356.     Node_statement_list,    /* lnode is statement, rnode is more list */
  357.     Node_switch_body,    /* lnode is the case list, rnode is default list */
  358.     Node_case_list,    /* lnode is the case, rnode is a statement list */
  359.     Node_if_branches,    /* lnode is to run on true, rnode on false */
  360.     Node_expression_list,    /* lnode is an exp, rnode is more list */
  361.     Node_param_list,    /* lnode is a variable, rnode is more list */
  362.  
  363.     /* keywords */
  364.     Node_K_if,        /* lnode is conditonal, rnode is if_branches */
  365.     Node_K_switch,        /* lnode is switch value, rnode is body of case statements */
  366.     Node_K_case,        /* lnode is case value, rnode is stuff to run */
  367.     Node_K_default,        /* lnode is empty, rnode is stuff to run */
  368.     Node_K_while,        /* lnode is condtional, rnode is stuff to run */
  369.     Node_K_for,        /* lnode is for_struct, rnode is stuff to run */
  370.     Node_K_arrayfor,    /* lnode is for_struct, rnode is stuff to run */
  371.     Node_K_break,        /* no subs */
  372.     Node_K_continue,    /* no subs */
  373.     Node_K_print,        /* lnode is exp_list, rnode is redirect */
  374.     Node_K_print_rec,    /* lnode is NULL, rnode is redirect */
  375.     Node_K_printf,        /* lnode is exp_list, rnode is redirect */
  376.     Node_K_next,        /* no subs */
  377.     Node_K_exit,        /* subnode is return value, or NULL */
  378.     Node_K_do,        /* lnode is conditional, rnode stuff to run */
  379.     Node_K_return,        /* lnode is return value */
  380.     Node_K_delete,        /* lnode is array, rnode is subscript */
  381.     Node_K_delete_loop,    /* lnode is array, rnode is subscript */
  382.     Node_K_getline,        /* lnode is opt var, rnode is redirection */
  383.     Node_K_function,    /* lnode is statement list, rnode is params */
  384.     Node_K_nextfile,    /* no subs */
  385.  
  386.     /* I/O redirection for print statements */
  387.     Node_redirect_output,    /* subnode is where to redirect */
  388.     Node_redirect_append,    /* subnode is where to redirect */
  389.     Node_redirect_pipe,    /* subnode is where to redirect */
  390.     Node_redirect_pipein,    /* subnode is where to redirect */
  391.     Node_redirect_input,    /* subnode is where to redirect */
  392.     Node_redirect_twoway,    /* subnode is where to redirect */
  393.  
  394.     /* Variables */
  395.     Node_var_new,        /* newly created variable, may become an array */
  396.     Node_var,        /* scalar variable, lnode is value */
  397.     Node_var_array,        /* array is ptr to elements, table_size num of eles */
  398.     Node_val,        /* node is a value - type in flags */
  399.  
  400.     /* Builtins   subnode is explist to work on, builtin is func to call */
  401.     Node_builtin,
  402.  
  403.     /*
  404.      * pattern: conditional ',' conditional ;  lnode of Node_line_range
  405.      * is the two conditionals (Node_cond_pair), other word (rnode place)
  406.      * is a flag indicating whether or not this range has been entered.
  407.      */
  408.     Node_line_range,
  409.  
  410.     /*
  411.      * boolean test of membership in array
  412.      * lnode is string-valued, expression rnode is array name 
  413.      */
  414.     Node_in_array,
  415.  
  416.     Node_func,        /* lnode is param. list, rnode is body */
  417.     Node_func_call,        /* lnode is name, rnode is argument list */
  418.  
  419.     Node_cond_exp,        /* lnode is conditonal, rnode is if_branches */
  420.     Node_regex,        /* a regexp, text, compiled, flags, etc */
  421.     Node_dynregex,        /* a dynamic regexp */
  422.     Node_hashnode,        /* an identifier in the symbol table */
  423.     Node_ahash,        /* an array element */
  424.     Node_array_ref,        /* array passed by ref as parameter */
  425.  
  426.     Node_BINMODE,        /* variables recognized in the grammar */
  427.     Node_CONVFMT,
  428.     Node_FIELDWIDTHS,
  429.     Node_FNR,
  430.     Node_FS,
  431.     Node_IGNORECASE,
  432.     Node_LINT,
  433.     Node_NF,
  434.     Node_NR,
  435.     Node_OFMT,
  436.     Node_OFS,
  437.     Node_ORS,
  438.     Node_RS,
  439.     Node_TEXTDOMAIN,
  440.     Node_SUBSEP,
  441.     Node_final        /* sentry value, not legal */
  442. } NODETYPE;
  443.  
  444. /*
  445.  * NOTE - this struct is a rather kludgey -- it is packed to minimize
  446.  * space usage, at the expense of cleanliness.  Alter at own risk.
  447.  */
  448. typedef struct exp_node {
  449.     union {
  450.         struct {
  451.             union {
  452.                 struct exp_node *lptr;
  453.                 char *param_name;
  454.                 long ll;
  455.             } l;
  456.             union {
  457.                 struct exp_node *rptr;
  458.                 struct exp_node *(*pptr) P((struct exp_node *));
  459.                 Regexp *preg;
  460.                 struct for_loop_header *hd;
  461.                 struct exp_node **av;
  462.                 int r_ent;    /* range entered */
  463.             } r;
  464.             union {
  465.                 struct exp_node *extra;
  466.                 long xl;
  467.                 char **param_list;
  468.             } x;
  469.             char *name;
  470.             short number;
  471.             unsigned long reflags;
  472. #                define    CASE    1
  473. #                define    CONST    2
  474. #                define    FS_DFLT    4
  475.         } nodep;
  476.         struct {
  477.             AWKNUM fltnum;    /* this is here for optimal packing of
  478.                      * the structure on many machines
  479.                      */
  480.             char *sp;
  481.             size_t slen;
  482.             long sref;
  483.             int idx;
  484.         } val;
  485.         struct {
  486.             struct exp_node *next;
  487.             char *name;
  488.             size_t length;
  489.             struct exp_node *value;
  490.             long ref;
  491.         } hash;
  492. #define    hnext    sub.hash.next
  493. #define    hname    sub.hash.name
  494. #define    hlength    sub.hash.length
  495. #define    hvalue    sub.hash.value
  496.  
  497. #define    ahnext        sub.hash.next
  498. #define    ahname_str    sub.hash.name
  499. #define ahname_len    sub.hash.length
  500. #define    ahvalue    sub.hash.value
  501. #define ahname_ref    sub.hash.ref
  502.     } sub;
  503.     NODETYPE type;
  504.     unsigned short flags;
  505. #        define    MALLOC    1    /* can be free'd */
  506. #        define    TEMP    2    /* should be free'd */
  507. #        define    PERM    4    /* can't be free'd */
  508. #        define    STRING    8    /* assigned as string */
  509. #        define    STRCUR    16    /* string value is current */
  510. #        define    NUMCUR    32    /* numeric value is current */
  511. #        define    NUMBER    64    /* assigned as number */
  512. #        define    MAYBE_NUM 128    /* user input: if NUMERIC then
  513.                      * a NUMBER */
  514. #        define    ARRAYMAXED 256    /* array is at max size */
  515. #        define    FUNC    512    /* this parameter is really a
  516.                      * function name; see awkgram.y */
  517. #        define    FIELD    1024    /* this is a field */
  518. #        define    INTLSTR    2048    /* use localized version */
  519. } NODE;
  520.  
  521. #define vname sub.nodep.name
  522. #define exec_count sub.nodep.reflags
  523.  
  524. #define lnode    sub.nodep.l.lptr
  525. #define nextp    sub.nodep.l.lptr
  526. #define rnode    sub.nodep.r.rptr
  527. #define source_file    sub.nodep.name
  528. #define    source_line    sub.nodep.number
  529. #define    param_cnt    sub.nodep.number
  530. #define param    sub.nodep.l.param_name
  531. #define parmlist    sub.nodep.x.param_list
  532.  
  533. #define subnode    lnode
  534. #define builtin sub.nodep.r.pptr
  535. #define callresult sub.nodep.x.extra
  536. #define funcbody sub.nodep.x.extra
  537.  
  538. #define re_reg    sub.nodep.r.preg
  539. #define re_flags sub.nodep.reflags
  540. #define re_text lnode
  541. #define re_exp    sub.nodep.x.extra
  542. #define    re_cnt    sub.nodep.number
  543.  
  544. #define forloop    rnode->sub.nodep.r.hd
  545.  
  546. #define stptr    sub.val.sp
  547. #define stlen    sub.val.slen
  548. #define stref    sub.val.sref
  549. #define    stfmt    sub.val.idx
  550.  
  551. #define numbr    sub.val.fltnum
  552.  
  553. /* Node_var: */
  554. #define var_value lnode
  555.  
  556. /* Node_var_array: */
  557. #define var_array sub.nodep.r.av
  558. #define array_size sub.nodep.l.ll
  559. #define table_size sub.nodep.x.xl
  560.  
  561. /* Node_array_ref: */
  562. #define orig_array sub.nodep.x.extra
  563. #define prev_array rnode
  564.  
  565. #define printf_count sub.nodep.x.xl
  566.  
  567. #define condpair lnode
  568. #define triggered sub.nodep.r.r_ent
  569.  
  570. /* a regular for loop */
  571. typedef struct for_loop_header {
  572.     NODE *init;
  573.     NODE *cond;
  574.     NODE *incr;
  575. } FOR_LOOP_HEADER;
  576.  
  577. typedef struct iobuf {
  578.     const char *name;       /* filename */
  579.     int fd;                 /* file descriptor */
  580.     struct stat sbuf;       /* stat buf */
  581.     char *buf;              /* start data buffer */
  582.     char *off;              /* start of current record in buffer */
  583.     char *dataend;          /* first byte in buffer to hold new data,
  584.                    NULL if not read yet */
  585.     char *end;              /* end of buffer */
  586.     size_t readsize;        /* set from fstat call */
  587.     size_t size;            /* buffer size */
  588.     ssize_t count;          /* amount read last time */
  589.     size_t scanoff;         /* where we were in the buffer when we had
  590.                    to regrow/refill */
  591.     int flag;
  592. #        define    IOP_IS_TTY    1
  593. #        define    IOP_IS_INTERNAL    2
  594. #        define    IOP_NO_FREE    4
  595. #        define    IOP_NOFREE_OBJ    8
  596. #               define  IOP_AT_EOF      16
  597. #               define  IOP_CLOSED      32
  598. } IOBUF;
  599.  
  600. typedef void (*Func_ptr) P((void));
  601.  
  602. /* structure used to dynamically maintain a linked-list of open files/pipes */
  603. struct redirect {
  604.     unsigned int flag;
  605. #        define    RED_FILE    1
  606. #        define    RED_PIPE    2
  607. #        define    RED_READ    4
  608. #        define    RED_WRITE    8
  609. #        define    RED_APPEND    16
  610. #        define    RED_NOBUF    32
  611. #        define    RED_USED    64    /* closed temporarily to reuse fd */
  612. #        define    RED_EOF        128
  613. #        define    RED_TWOWAY    256
  614. #        define    RED_PTY        512
  615. #        define    RED_SOCKET    1024
  616. #        define    RED_TCP        2048
  617.     char *value;
  618.     FILE *fp;
  619.     FILE *ifp;    /* input fp, needed for PIPES_SIMULATED */
  620.     IOBUF *iop;
  621.     int pid;
  622.     int status;
  623.     struct redirect *prev;
  624.     struct redirect *next;
  625.     const char *mode;
  626. };
  627.  
  628. /*
  629.  * structure for our source, either a command line string or a source file.
  630.  * the same structure is used to remember variable pre-assignments.
  631.  */
  632. struct src {
  633.        enum srctype { CMDLINE = 1, SOURCEFILE,
  634.             PRE_ASSIGN, PRE_ASSIGN_FS } stype;
  635.        char *val;
  636. };
  637.  
  638. /* for debugging purposes */
  639. struct flagtab {
  640.     int val;
  641.     const char *name;
  642. };
  643.  
  644. /* longjmp return codes, must be nonzero */
  645. /* Continue means either for loop/while continue, or next input record */
  646. #define TAG_CONTINUE 1
  647. /* Break means either for/while break, or stop reading input */
  648. #define TAG_BREAK 2
  649. /* Return means return from a function call; leave value in ret_node */
  650. #define    TAG_RETURN 3
  651.  
  652. #ifndef LONG_MAX
  653. #define LONG_MAX ((long)(~(1L << (sizeof (long) * 8 - 1))))
  654. #endif
  655. #ifndef ULONG_MAX
  656. #define ULONG_MAX (~(unsigned long)0)
  657. #endif
  658. #ifndef LONG_MIN
  659. #define LONG_MIN ((long)(-LONG_MAX - 1L))
  660. #endif
  661. #define UNLIMITED    LONG_MAX 
  662.  
  663. /* -------------------------- External variables -------------------------- */
  664. /* gawk builtin variables */
  665. extern long NF;
  666. extern long NR;
  667. extern long FNR;
  668. extern int BINMODE;
  669. extern int IGNORECASE;
  670. extern int RS_is_null;
  671. extern char *OFS;
  672. extern int OFSlen;
  673. extern char *ORS;
  674. extern int ORSlen;
  675. extern char *OFMT;
  676. extern char *CONVFMT;
  677. ATTRIBUTE_EXPORTED extern int CONVFMTidx;
  678. extern int OFMTidx;
  679. extern char *TEXTDOMAIN;
  680. extern NODE *BINMODE_node, *CONVFMT_node, *FIELDWIDTHS_node, *FILENAME_node;
  681. extern NODE *FNR_node, *FS_node, *IGNORECASE_node, *NF_node;
  682. extern NODE *NR_node, *OFMT_node, *OFS_node, *ORS_node, *RLENGTH_node;
  683. extern NODE *RSTART_node, *RS_node, *RT_node, *SUBSEP_node, *PROCINFO_node;
  684. extern NODE *LINT_node, *ERRNO_node, *TEXTDOMAIN_node;
  685. ATTRIBUTE_EXPORTED extern NODE **stack_ptr;
  686. extern NODE *Nnull_string;
  687. extern NODE *Null_field;
  688. extern NODE **fields_arr;
  689. extern int sourceline;
  690. extern char *source;
  691. extern NODE *expression_value;
  692.  
  693. #if __GNUC__ < 2
  694. # if defined(WIN32_EXTENSION)
  695. static
  696. # else
  697. extern
  698. #endif
  699. NODE *_t;    /* used as temporary in tree_eval */
  700. #endif
  701.  
  702. extern NODE *nextfree;
  703. extern int field0_valid;
  704. extern int do_traditional;
  705. extern int do_posix;
  706. extern int do_intervals;
  707. extern int do_intl;
  708. extern int do_non_decimal_data;
  709. extern int do_dump_vars;
  710. extern int do_tidy_mem;
  711. extern int in_begin_rule;
  712. extern int in_end_rule;
  713. extern int whiny_users;
  714. #ifdef NO_LINT
  715. #define do_lint 0
  716. #define do_lint_old 0
  717. #else
  718. ATTRIBUTE_EXPORTED extern int do_lint;
  719. extern int do_lint_old;
  720. #endif
  721. #ifdef MBS_SUPPORT
  722. extern int gawk_mb_cur_max;
  723. #endif
  724.  
  725. #if defined (HAVE_GETGROUPS) && defined(NGROUPS_MAX) && NGROUPS_MAX > 0
  726. extern GETGROUPS_T *groupset;
  727. extern int ngroups;
  728. #endif
  729.  
  730. #ifdef HAVE_LOCALE_H
  731. extern struct lconv loc;
  732. #endif /* HAVE_LOCALE_H */
  733.  
  734. extern const char *myname;
  735.  
  736. extern char quote;
  737. extern char *defpath;
  738. extern char envsep;
  739.  
  740. extern char casetable[];    /* for case-independent regexp matching */
  741.  
  742. /* ------------------------- Pseudo-functions ------------------------- */
  743.  
  744. #define is_identchar(c)        (isalnum(c) || (c) == '_')
  745.  
  746. #define var_uninitialized(n)    ((n)->var_value == Nnull_string)
  747.  
  748. #ifdef MPROF
  749. #define    getnode(n)    emalloc((n), NODE *, sizeof(NODE), "getnode"), (n)->flags = 0, (n)-exec_count = 0;
  750. #define    freenode(n)    free(n)
  751. #else    /* not MPROF */
  752. #define    getnode(n)    if (nextfree) n = nextfree, nextfree = nextfree->nextp;\
  753.             else n = more_nodes()
  754. #ifndef NO_PROFILING
  755. #define    freenode(n)    ((n)->flags = 0,\
  756.         (n)->exec_count = 0, (n)->nextp = nextfree, nextfree = (n))
  757. #else /* not PROFILING */
  758. #define    freenode(n)    ((n)->flags = 0,\
  759.         (n)->nextp = nextfree, nextfree = (n))
  760. #endif    /* not PROFILING */
  761. #endif    /* not MPROF */
  762.  
  763. #ifndef GAWKDEBUG
  764. #define DUPNODE_MACRO 1
  765. /*
  766.  * Speed up the path leading to r_dupnode, as well as duplicating TEMP nodes,
  767.  * on expense of slowing down the access to PERM nodes (by two instructions).
  768.  * This is right since PERM nodes are realtively rare.
  769.  *
  770.  * The code also sets MALLOC flag for PERM nodes, which should not matter.
  771.  */
  772. #define DUPNODE_COMMON    (_t->flags & (TEMP|PERM)) != 0 ? \
  773.               (_t->flags &= ~TEMP, _t->flags |= MALLOC, _t) : \
  774.               r_dupnode(_t)
  775. #if __GNUC__ >= 2
  776. #define dupnode(n)    ({NODE * _t = (n); DUPNODE_COMMON;})
  777. #else
  778. #define dupnode(n)    (_t = (n), DUPNODE_COMMON)
  779. #endif
  780. #else    /* GAWKDEBUG */
  781. #define dupnode(n)    r_dupnode(n)
  782. #endif    /* GAWKDEBUG */
  783.  
  784. #define get_array(t)    get_actual(t, TRUE)    /* allowed to die fatally */
  785. #define get_param(t)    get_actual(t, FALSE)    /* not allowed */
  786.  
  787. #ifdef MEMDEBUG
  788. #undef freenode
  789. #define    get_lhs(p, a, r)    r_get_lhs((p), (a), (r))
  790. #define    m_tree_eval(t, iscond)    r_tree_eval(t, iscond)
  791. #else
  792. #define    get_lhs(p, a, r) ((p)->type == Node_var && \
  793.               ! var_uninitialized(p) ? \
  794.               (&(p)->var_value) : \
  795.              r_get_lhs((p), (a), (r)))
  796. #define TREE_EVAL_MACRO 1
  797. #if __GNUC__ >= 2
  798. #define    m_tree_eval(t, iscond) __extension__ \
  799.                         ({NODE * _t = (t);                 \
  800.                    if (_t == (NODE*)NULL)      \
  801.                     cant_happen();     \
  802.                    switch(_t->type) {          \
  803.                    case Node_val:              \
  804.                    if (_t->flags&INTLSTR)  \
  805.                     _t = r_force_string(_t); \
  806.                    break;                  \
  807.                    case Node_var:              \
  808.                    if (! var_uninitialized(_t)) { \
  809.                        _t = _t->var_value;                \
  810.                        break;                             \
  811.                    }                       \
  812.                    /*FALLTHROUGH*/               \
  813.                    default:                    \
  814.                    _t = r_tree_eval(_t, iscond);\
  815.                    break;                  \
  816.                    }                           \
  817.                _t;})
  818. #else
  819. #define    m_tree_eval(t, iscond)    (_t = (t), _t == (NODE*)NULL ? (cant_happen(), (NODE*)NULL) : \
  820.             (_t->type == Node_param_list ? \
  821.               r_tree_eval(_t, iscond) : \
  822.             ((_t->type == Node_val && (_t->flags&INTLSTR)) ? \
  823.                 r_force_string(_t) : \
  824.             (_t->type == Node_val ? _t : \
  825.             (_t->type == Node_var && \
  826.              ! var_uninitialized(_t) ? _t->var_value : \
  827.              r_tree_eval(_t, iscond))))))
  828. #endif /* __GNUC__ */
  829. #endif /* not MEMDEBUG */
  830. #define tree_eval(t)    m_tree_eval(t, FALSE)
  831.  
  832. #define    make_number(x)    mk_number((x), (unsigned int)(MALLOC|NUMCUR|NUMBER))
  833. #define    tmp_number(x)    mk_number((x), (unsigned int)(MALLOC|TEMP|NUMCUR|NUMBER))
  834.  
  835. #define    free_temp(n)    do { NODE *_n = (n); if (_n->flags&TEMP) unref(_n);} \
  836.                 while (FALSE)
  837.  
  838. #define    make_string(s, l)    make_str_node((s), (size_t) (l), 0)
  839. #define        SCAN            1
  840. #define        ALREADY_MALLOCED    2
  841.  
  842. #define    cant_happen()    r_fatal("internal error line %d, file: %s", \
  843.                 __LINE__, __FILE__)
  844.  
  845. /*
  846.  * For SunOS 4.1.x which is pre-Standard C, `realloc' doesn't
  847.  * accept NULL. Sigh.  The check must be done for both cases,
  848.  * since could be using GCC but with stock C library. Sigh, again.
  849.  */
  850. #ifdef HAVE_STRINGIZE
  851. #define    emalloc(var,ty,x,str)    (void)((var=(ty)malloc((MALLOC_ARG_T)(x))) ||\
  852.                  (fatal(_("%s: %s: can't allocate %ld bytes of memory (%s)"),\
  853.                     (str), #var, (long) (x), strerror(errno)),0))
  854. #define    erealloc(var,ty,x,str)    (void)((var = ((var == NULL) \
  855.                     ? (ty)malloc((MALLOC_ARG_T)(x)) \
  856.                     : (ty)realloc((char *)var, (MALLOC_ARG_T)(x))) ) \
  857.                 ||\
  858.                  (fatal(_("%s: %s: can't allocate %ld bytes of memory (%s)"),\
  859.                     (str), #var, (long) (x), strerror(errno)),0))
  860. #else /* HAVE_STRINGIZE */
  861. #define    emalloc(var,ty,x,str)    (void)((var=(ty)malloc((MALLOC_ARG_T)(x))) ||\
  862.                  (fatal(_("%s: %s: can't allocate %ld bytes of memory (%s)"),\
  863.                     (str), "var", (long) (x), strerror(errno)),0))
  864. #define    erealloc(var,ty,x,str)    (void)((var = ((var == NULL) \
  865.                     ? (ty)malloc((MALLOC_ARG_T)(x)) \
  866.                     : (ty)realloc((char *)var, (MALLOC_ARG_T)(x))) ) \
  867.                 ||\
  868.                  (fatal(_("%s: %s: can't allocate %ld bytes of memory (%s)"),\
  869.                     (str), "var", (long) (x), strerror(errno)),0))
  870. #endif /* HAVE_STRINGIZE */
  871.  
  872. #ifdef GAWKDEBUG
  873. #define    force_number    r_force_number
  874. #define    force_string    r_force_string
  875. #else /* not GAWKDEBUG */
  876. #ifdef lint
  877. extern AWKNUM force_number();
  878. #endif
  879. #if __GNUC__ >= 2
  880. #define    force_number(n)    __extension__ ({NODE *_tn = (n);\
  881.             (_tn->flags & NUMCUR) ?_tn->numbr : r_force_number(_tn);})
  882. #define    force_string(s)    __extension__ ({NODE *_ts = (s);\
  883.               ((_ts->flags & INTLSTR) ? \
  884.                 r_force_string(_ts) : \
  885.               ((_ts->flags & STRCUR) && \
  886.                (_ts->stfmt == -1 || _ts->stfmt == CONVFMTidx)) ?\
  887.               _ts : r_force_string(_ts));})
  888. #else
  889. #ifdef MSDOS
  890. extern double _msc51bug;
  891. #define    force_number(n)    (_msc51bug=(_t = (n),\
  892.               (_t->flags & NUMCUR) ? _t->numbr : r_force_number(_t)))
  893. #else /* not MSDOS */
  894. #define    force_number(n)    (_t = (n),\
  895.              (_t->flags & NUMCUR) ? _t->numbr : r_force_number(_t))
  896. #endif /* not MSDOS */
  897. #define    force_string(s)    (_t = (s),(_t->flags & INTLSTR) ? \
  898.                     r_force_string(_t) :\
  899.                 ((_t->flags & STRCUR) && \
  900.                  (_t->stfmt == -1 || \
  901.                  _t->stfmt == CONVFMTidx))? \
  902.              _t : r_force_string(_t))
  903.  
  904. #endif /* not __GNUC__ */
  905. #endif /* not GAWKDEBUG */
  906.  
  907. #define    STREQ(a,b)    (*(a) == *(b) && strcmp((a), (b)) == 0)
  908. #define    STREQN(a,b,n)    ((n) && *(a)== *(b) && \
  909.              strncmp((a), (b), (size_t) (n)) == 0)
  910.  
  911. #define fatal        set_loc(__FILE__, __LINE__), r_fatal
  912.  
  913. /* ------------- Function prototypes or defs (as appropriate) ------------- */
  914.  
  915. /* array.c */
  916. extern NODE *get_actual P((NODE *symbol, int canfatal));
  917. extern char *array_vname P((const NODE *symbol));
  918. extern void array_init P((void));
  919. extern NODE *concat_exp P((NODE *tree));
  920. extern void assoc_clear P((NODE *symbol));
  921. extern NODE *in_array P((NODE *symbol, NODE *subs));
  922. extern NODE **assoc_lookup P((NODE *symbol, NODE *subs, int reference));
  923. extern void do_delete P((NODE *symbol, NODE *tree));
  924. extern void do_delete_loop P((NODE *symbol, NODE *tree));
  925. extern void set_SUBSEP P((void));
  926. extern NODE *assoc_dump P((NODE *symbol));
  927. extern NODE *do_adump P((NODE *tree));
  928. extern NODE *do_asort P((NODE *tree));
  929. extern NODE *do_asorti P((NODE *tree));
  930. extern unsigned long (*hash)P((const char *s, size_t len, unsigned long hsize));
  931. /* awkgram.c */
  932. extern char *tokexpand P((void));
  933. extern NODE *node P((NODE *left, NODETYPE op, NODE *right));
  934. extern NODE *install P((char *name, NODE *value));
  935. extern NODE *lookup P((const char *name));
  936. extern NODE *variable P((char *name, int can_free, NODETYPE type));
  937. extern int yyparse P((void));
  938. extern void dump_funcs P((void));
  939. extern void dump_vars P((const char *fname));
  940. extern void release_all_vars P((void));
  941. extern const char *getfname P((NODE *(*)(NODE *)));
  942. extern NODE *stopme P((NODE *tree));
  943. extern void shadow_funcs P((void));
  944. extern int check_special P((const char *name));
  945. /* builtin.c */
  946. extern double double_to_int P((double d));
  947. extern NODE *do_exp P((NODE *tree));
  948. extern NODE *do_fflush P((NODE *tree));
  949. extern NODE *do_index P((NODE *tree));
  950. extern NODE *do_int P((NODE *tree));
  951. extern NODE *do_length P((NODE *tree));
  952. extern NODE *do_log P((NODE *tree));
  953. extern NODE *do_mktime P((NODE *tree));
  954. extern NODE *do_sprintf P((NODE *tree));
  955. extern void do_printf P((NODE *tree));
  956. extern void print_simple P((NODE *tree, FILE *fp));
  957. extern NODE *do_sqrt P((NODE *tree));
  958. extern NODE *do_substr P((NODE *tree));
  959. extern NODE *do_strftime P((NODE *tree));
  960. extern NODE *do_systime P((NODE *tree));
  961. extern NODE *do_system P((NODE *tree));
  962. extern void do_print P((NODE *tree));
  963. extern void do_print_rec P((NODE *tree));
  964. extern NODE *do_tolower P((NODE *tree));
  965. extern NODE *do_toupper P((NODE *tree));
  966. extern NODE *do_atan2 P((NODE *tree));
  967. extern NODE *do_sin P((NODE *tree));
  968. extern NODE *do_cos P((NODE *tree));
  969. extern NODE *do_rand P((NODE *tree));
  970. extern NODE *do_srand P((NODE *tree));
  971. extern NODE *do_match P((NODE *tree));
  972. extern NODE *do_gsub P((NODE *tree));
  973. extern NODE *do_sub P((NODE *tree));
  974. extern NODE *do_gensub P((NODE *tree));
  975. extern NODE *format_tree P((const char *, size_t, NODE *, long));
  976. extern NODE *do_lshift P((NODE *tree));
  977. extern NODE *do_rshift P((NODE *tree));
  978. extern NODE *do_and P((NODE *tree));
  979. extern NODE *do_or P((NODE *tree));
  980. extern NODE *do_xor P((NODE *tree));
  981. extern NODE *do_compl P((NODE *tree));
  982. extern NODE *do_strtonum P((NODE *tree));
  983. extern AWKNUM nondec2awknum P((char *str, size_t len));
  984. extern NODE *do_dcgettext P((NODE *tree));
  985. extern NODE *do_dcngettext P((NODE *tree));
  986. extern NODE *do_bindtextdomain P((NODE *tree));
  987. #ifdef MBS_SUPPORT
  988. extern int strncasecmpmbs P((const char *, mbstate_t, const char *,
  989.                  mbstate_t, size_t));
  990. #endif
  991. /* eval.c */
  992. extern int interpret P((NODE *volatile tree));
  993. extern NODE *r_tree_eval P((NODE *tree, int iscond));
  994. extern int cmp_nodes P((NODE *t1, NODE *t2));
  995. extern NODE **r_get_lhs P((NODE *ptr, Func_ptr *assign, int reference));
  996. extern void set_IGNORECASE P((void));
  997. extern void set_OFS P((void));
  998. extern void set_ORS P((void));
  999. extern void set_OFMT P((void));
  1000. extern void set_CONVFMT P((void));
  1001. extern void set_BINMODE P((void));
  1002. extern void set_LINT P((void));
  1003. extern void set_TEXTDOMAIN P((void));
  1004. extern void update_ERRNO P((void));
  1005. extern const char *redflags2str P((int));
  1006. extern const char *flags2str P((int));
  1007. extern const char *genflags2str P((int flagval, const struct flagtab *tab));
  1008. extern const char *nodetype2str P((NODETYPE type));
  1009. extern NODE *assign_val P((NODE **lhs_p, NODE *rhs));
  1010. extern void load_casetable P((void));
  1011. extern size_t get_curfunc_arg_count P((void));
  1012. #ifdef PROFILING
  1013. extern void dump_fcall_stack P((FILE *fp));
  1014. #endif
  1015. /* ext.c */
  1016. NODE *do_ext P((NODE *));
  1017. #ifdef DYNAMIC
  1018. void make_builtin P((char *, NODE *(*)(NODE *), int));
  1019. NODE *get_argument P((NODE *, int));
  1020. NODE *get_actual_argument P((NODE *, unsigned int, int, int));
  1021. #define get_scalar_argument(t, i, opt)  get_actual_argument((t), (i), (opt), FALSE)
  1022. #define get_array_argument(t, i, opt)   get_actual_argument((t), (i), (opt), TRUE)
  1023. void set_value P((NODE *));
  1024. #endif
  1025. /* field.c */
  1026. extern void init_fields P((void));
  1027. extern void set_record P((const char *buf, int cnt));
  1028. extern void reset_record P((void));
  1029. extern void set_NF P((void));
  1030. extern NODE **get_field P((long num, Func_ptr *assign));
  1031. extern NODE *do_split P((NODE *tree));
  1032. extern void set_FS P((void));
  1033. extern void set_RS P((void));
  1034. extern void set_FIELDWIDTHS P((void));
  1035. extern int using_fieldwidths P((void));
  1036. /* gawkmisc.c */
  1037. extern char *gawk_name P((const char *filespec));
  1038. extern void os_arg_fixup P((int *argcp, char ***argvp));
  1039. extern int os_devopen P((const char *name, int flag));
  1040. extern void os_close_on_exec P((int fd, const char *name, const char *what,
  1041.                 const char *dir));
  1042. extern int os_isdir P((int fd));
  1043. extern int os_is_setuid P((void));
  1044. extern int os_setbinmode P((int fd, int mode));
  1045. extern void os_restore_mode P((int fd));
  1046. extern size_t optimal_bufsize P((int fd, struct stat *sbuf));
  1047. extern int ispath P((const char *file));
  1048. extern int isdirpunct P((int c));
  1049. #if defined(_MSC_VER) && !defined(_WIN32)
  1050. extern char *memcpy_ulong P((char *dest, const char *src, unsigned long l));
  1051. extern void *memset_ulong P((void *dest, int val, unsigned long l));
  1052. #define memcpy memcpy_ulong
  1053. #define memset memset_ulong
  1054. #endif
  1055. /* io.c */
  1056. extern void set_FNR P((void));
  1057. extern void set_NR P((void));
  1058. extern void do_input P((void));
  1059. extern struct redirect *redirect P((NODE *tree, int *errflg));
  1060. extern NODE *do_close P((NODE *tree));
  1061. extern int flush_io P((void));
  1062. extern int close_io P((void));
  1063. extern int devopen P((const char *name, const char *mode));
  1064. extern int pathopen P((const char *file));
  1065. extern NODE *do_getline P((NODE *tree));
  1066. extern void do_nextfile P((void)) ATTRIBUTE_NORETURN;
  1067. extern struct redirect *getredirect P((const char *str, int len));
  1068. /* main.c */
  1069. extern int main P((int argc, char **argv));
  1070. extern NODE *load_environ P((void));
  1071. extern NODE *load_procinfo P((void));
  1072. extern int arg_assign P((char *arg, int initing));
  1073. /* msg.c */
  1074. extern void err P((const char *s, const char *emsg, va_list argp)) ATTRIBUTE_PRINTF(2, 0);
  1075. #if _MSC_VER == 510
  1076. extern void msg P((va_list va_alist, ...));
  1077. extern void error P((va_list va_alist, ...));
  1078. extern void warning P((va_list va_alist, ...));
  1079. extern void set_loc P((const char *file, int line));
  1080. extern void r_fatal P((va_list va_alist, ...));
  1081. extern void (*lintfunc) P((va_list va_alist, ...));
  1082. #else
  1083. #if defined(HAVE_STDARG_H) && defined(__STDC__) && __STDC__
  1084. extern void msg (const char *mesg, ...) ATTRIBUTE_PRINTF_1;
  1085. extern void error (const char *mesg, ...) ATTRIBUTE_PRINTF_1;
  1086. extern void warning (const char *mesg, ...) ATTRIBUTE_PRINTF_1;
  1087. extern void set_loc (const char *file, int line);
  1088. extern void r_fatal (const char *mesg, ...) ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN;
  1089. ATTRIBUTE_EXPORTED 
  1090. #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
  1091. extern void (*lintfunc) (const char *mesg, ...) ATTRIBUTE_PRINTF_1;
  1092. #else
  1093. extern void (*lintfunc) (const char *mesg, ...);
  1094. #endif
  1095. #else
  1096. extern void msg ();
  1097. extern void error ();
  1098. extern void warning ();
  1099. extern void set_loc ();
  1100. extern void r_fatal ();
  1101. extern void (*lintfunc) ();
  1102. #endif
  1103. #endif
  1104. /* profile.c */
  1105. extern void init_profiling P((int *flag, const char *def_file));
  1106. extern void init_profiling_signals P((void));
  1107. extern void set_prof_file P((const char *filename));
  1108. extern void dump_prog P((NODE *begin, NODE *prog, NODE *end));
  1109. extern void pp_func P((const char *name, size_t namelen, NODE *f));
  1110. extern void pp_string_fp P((FILE *fp, const char *str, size_t namelen,
  1111.             int delim, int breaklines));
  1112. /* node.c */
  1113. extern AWKNUM r_force_number P((NODE *n));
  1114. extern NODE *format_val P((const char *format, int index, NODE *s));
  1115. extern NODE *r_force_string P((NODE *s));
  1116. extern NODE *r_dupnode P((NODE *n));
  1117. extern NODE *copynode P((NODE *n));
  1118. extern NODE *mk_number P((AWKNUM x, unsigned int flags));
  1119. extern NODE *make_str_node P((char *s, unsigned long len, int scan ));
  1120. extern NODE *tmp_string P((char *s, size_t len ));
  1121. extern NODE *more_nodes P((void));
  1122. #ifdef MEMDEBUG
  1123. extern void freenode P((NODE *it));
  1124. #endif
  1125. extern void unref P((NODE *tmp));
  1126. extern int parse_escape P((const char **string_ptr));
  1127. /* re.c */
  1128. extern Regexp *make_regexp P((const char *s, size_t len, int ignorecase, int dfa));
  1129. extern int research P((Regexp *rp, char *str, int start,
  1130.                size_t len, int need_start));
  1131. extern void refree P((Regexp *rp));
  1132. extern void reg_error P((const char *s));
  1133. extern Regexp *re_update P((NODE *t));
  1134. extern void resyntax P((int syntax));
  1135. extern void resetup P((void));
  1136. extern int avoid_dfa P((NODE *re, char *str, size_t len));    /* temporary */
  1137. extern int reisstring P((const char *text, size_t len, Regexp *re, const char *buf));
  1138. extern int remaybelong P((const char *text, size_t len));
  1139. extern int isnondecimal P((const char *str, int use_locale));
  1140.  
  1141. /* strncasecmp.c */
  1142. #ifndef BROKEN_STRNCASECMP
  1143. extern int strcasecmp P((const char *s1, const char *s2));
  1144. extern int strncasecmp P((const char *s1, const char *s2, register size_t n));
  1145. #endif
  1146.  
  1147. #if defined(atarist)
  1148. #if defined(PIPES_SIMULATED)
  1149. /* unsupported/atari/tmpnam.c */
  1150. extern char *tmpnam P((char *buf));
  1151. extern char *tempnam P((const char *path, const char *base));
  1152. #else
  1153. #include <wait.h>
  1154. #endif
  1155. #include <fcntl.h>
  1156. #define INVALID_HANDLE  (__SMALLEST_VALID_HANDLE - 1)
  1157. #else
  1158. #define INVALID_HANDLE (-1)
  1159. #endif /* atarist */
  1160.  
  1161. #ifdef HAVE_SYS_WAIT_H
  1162. #include <sys/wait.h>
  1163. #endif
  1164. #ifndef WEXITSTATUS
  1165. #define WEXITSTATUS(stat_val) ((((unsigned) (stat_val)) >> 8) & 0xFF)
  1166. #endif
  1167.  
  1168. #ifndef STATIC
  1169. #define STATIC static
  1170. #endif
  1171.